package com.zsz.service.impl;

import com.zsz.dao.GoodsDao;
import com.zsz.dao.SaleDao;
import com.zsz.domain.Goods;
import com.zsz.domain.Sale;
import com.zsz.excep.NotEnoughException;
import com.zsz.service.BuyGoodsService;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

public class BuyGoodsServiceImpl implements BuyGoodsService {
    private SaleDao saleDao;
    private GoodsDao goodsDao;


    /**
     *isolation：表示事物的隔离级别
     *rollbackFor:表示发生指定的异常一定回滚。
     *
     *            1）处理逻辑是：spring框架会首先检查方法抛出的异常是不是在rollbackFor的属性值中，
     *               如果异常在rollbackFor的列表中，不管是神魔类型的异常，一定回滚。
     *            2）如果你的跑出的异常不在rollbackFor列表中，spring会判断异常是不是RunTimeException，
     *               如果是那么一定回滚。
     */
//    @Transactional(
//            propagation = Propagation.REQUIRED,
//            isolation = Isolation.DEFAULT,
//            readOnly = false,
//            rollbackFor = {
//                    NotEnoughException.class,
//                    NullPointerException.class
//
//            }
//    )

    //使用的是失误控制的默认值，默认的传播行为是REQUIRED，默认你的隔离级别DEFAULT
    //默认的抛出运行时异常，回滚事务。
    @Transactional
    @Override
    public void buy(Integer goodsId, Integer nums) {
        System.out.println("===buy()方法的开始===");

       //记录销售信息，向sale表添加记录
        Sale sale=new Sale();
        sale.setGid(goodsId);
        sale.setNums(nums);
        saleDao.insertSale(sale);



        //更新库存
        Goods goods=goodsDao.selectGoods(goodsId);
        if (goods==null){
            //商品不存在
            throw new NullPointerException("编号是:"+goodsId+"的商品不存在");

        }else if (goods.getAmount()<nums){
            throw new NotEnoughException("编号是:\"+goodsId+\"的商品库存不足");

        }

        //修改库存了
        Goods buyGoods=new Goods();
        buyGoods.setId(goodsId);
        buyGoods.setAmount(nums);
        goodsDao.updateGoods(buyGoods);

        System.out.println("===buy()方法的完成===");


    }

    public void setSaleDao(SaleDao saleDao) {
        this.saleDao = saleDao;
    }

    public void setGoodsDao(GoodsDao goodsDao) {
        this.goodsDao = goodsDao;
    }
}
